<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <span>我是span</span>
    <div>我是div</div>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <ol>
        <li>我是li1</li>
        <li>我是li2</li>
        <li>我是li3</li>
        <li>我是li4</li>
    </ol>
    <div class="demo">
        <div class="box">
            <span class="erweima">x</span>
        </div>
    </div>
    <script>
        //  利用DOM树可以把结点划分为不同的层级关系，常见的是父子兄层级关系。
        //  1. 父级结点 node.parentNode
        var erweima = document.querySelector('.erweima');
        // var box = document.querySelector('.box');
        // 得到的是离元素最近的父级结点(亲爸爸) 如果找不到父节点，就返回为 null
        console.log(erweima.parentNode); // 通过span 父节点 获得 div

        // DOM 提供的方法（API）获取li
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        // 2. （1）子结点 parentNode.childNodes（标准）注意：返回值里面包含了所有的子节点：元素结点、文本结点等
        // parentNode.childNodes 返回包含指定结点的子结点的集合，该集合为及时更新的集合
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType); // 判断结点的类型
        console.log(ul.childNodes[1].nodeType);

        // 如果只想要获得里面的元素节点（例如ul里面的元素结点li），则需要专门处理，见下面的程序块。所以我们一般不提倡使用 childNodes
        var ul = document.querySelector('ul')
        for (var i = 0; i < ul.childNodes.length; i++) {
            if (ul.childNodes[i].nodeType == 1) {
                // ul.childNodes[i]是元素结点
                console.log(ul.childNodes[i]);
            }
        }

        // 2. (2) 子结点 parentNode.children（非标准）：获取所有的子元素节点,也是我们实际开发常用的。
        // parentNode.children 是一个只读属性， 返回所有的子元素节点。 它只返回子元素结点， 其余节点不返回。（ 这个我们重点掌握）
        // 虽然children是一个非标准，但是得到了各浏览器的支持，因此我们可以放心使用
        console.log(ul.children);

        // 2. (3) 子结点 parentNode.firstChild: 返回第一个子节点，找不到则返回null。同样，也是包含所有的结点。
        //    (4) 子结点 parentNode.lastChild: 返回最后一个子结点
        var ol = document.querySelector('ol');
        console.log(ol.firstChild); // 第一个子结点 不管是文本结点还是元素节点
        console.log(ol.lastChild);
        // 2. (5) 子结点 firstElementChild 返回第一个子元素结点
        //    (6) 子结点 lastElementChild 返回最后一个子元素结点
        // 注意:这两个方法有兼容性问题，IE9 以上才支持
        console.log(ol.firstElementChild);
        console.log(ol.lastElementChild);

        // 3. 实际开发的写法 既没有兼容性问题 又返回第一个子元素
        console.log(ol.children[0]);

        console.log(ol.children[3]);
        console.log(ol.children[ol.children.length - 1]);
    </script>

</body>

</html>